package com.xue.singleton;

import java.util.Objects;

public class Student {
    //成员变量
    private String stuName;
    private String stuSex;
    private int stuAge;
    //显示写出默认的构造方法
    public Student(){};

    /*
    *    私有成员变量初始化有两种途径：
    *       1、构造方法初始化
    *       2、Getter and Setter
    *
    * */

    //构造方法
    public Student(String stuName, String stuSex, int stuAge) {
        this.stuName = stuName;
        this.stuSex = stuSex;
        this.stuAge = stuAge;
    }

    //行为方法
    public void doStuding(){
        System.out.println("I am student...");
    }

    //自定义的equals方法
    public boolean equals (Object stu){/*如果将此行改为  public boolean equals2 (Object stu){
                                         *   则代码运行结果为false。
                                         *   因为改为equals2  相当于父类Object的equals方法没有重写
                                         *    走的是原始Object的equals方法 ,原始Object的equals方法就是==
                                         * */
        //==判定成立，则内容一定相同
        if (this==stu){
            return true;
        }
        //判定内容是否相等  （判定是否为string类型）
        //代码往上移 快捷键：shift+alt+向上的键（三角形）
        if (stu instanceof Student){
            //强制类型转换
            Student student = (Student) stu;
            //按业务逻辑进行内容的相等判定
            //规定：只有姓名、年龄、性别同时相同才相等
            if (this.stuName!=null && this.stuName.equals(student.stuName)
                    &&
                    this.stuSex!=null && this.stuSex.equals(student.stuSex)
                    &&
                    this.stuAge==student.stuAge
                    ){
               return true;
            }
        }
        //判定结果不相等
        return false;
    }

    /* @Override
    public boolean equals(Object o) {
        //==判定成立，则内容一定相同
        if (this == o) return true;
        //比较的对象如果为null，或者二者不是同一类型，则返回false
        if (o == null || getClass() != o.getClass()) return false;
        //按业务逻辑进行内容的相等判定
        Student student = (Student) o;  //强制类型转换
        return stuAge == student.stuAge &&
                (stuName !=null&&stuName.equals(student.stuName))
                &&
                Objects.equals(stuSex, student.stuSex);
    }*/
    @Override
    public int hashCode() {

        return Objects.hash(stuName, stuSex, stuAge);
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuSex() {
        return stuSex;
    }

    public void setStuSex(String stuSex) {
        this.stuSex = stuSex;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

   /*
   equals 判定内容相等   == 判定是不是同一个对象
   右键  选Generate 或  Alt+Fn+Insert
   选择 equals() and hashCode()

   @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return stuAge == student.stuAge &&
                Objects.equals(stuName, student.stuName) &&
                Objects.equals(stuSex, student.stuSex);
    }

    @Override
    public int hashCode() {

        return Objects.hash(stuName, stuSex, stuAge);
    }*/

}
